#ifndef ESTRATEGIARECURSOESCRITURADIFERIDA_H_
#define ESTRATEGIARECURSOESCRITURADIFERIDA_H_

#include "EstrategiaRecurso.h"
#include "WrapperBufferDiferido.h"

namespace Toolkit
{

class EstrategiaRecursoEscrituraDiferida: public EstrategiaRecurso
{
public:
	EstrategiaRecursoEscrituraDiferida(const TipoSerializacion tserializacion,
			const unsigned long int &tamanoBloque,
			const bool &controlarUnicidad = true);
	virtual ~EstrategiaRecursoEscrituraDiferida();

	virtual void guardarDato(const Dato &dato, const Clave &clave);

	virtual bool recuperarDato(const Clave &clave, Dato &dato);

	virtual void eliminarDato(const Clave &clave, Dato &dato);

	virtual void actualizarDato(const Dato &dato, const Clave &clave);

private:
	long int unidadPrimera;
	long int unidadUltima;

	bool recursoOcupado;

	Clave *claveAux;

	void flushBuffer();

	void imprimirCabezaLista(const unsigned long int &elementos) const;

	/**
	 * Baja a disco el componente en la posicion dad del buffer y devuelve la direccio al siguiente,
	 * o -1 si este no existe.
	 */
	long int flushComponente(const unsigned long int &posicionEnBuffer);

	void actualizarUnidadUsada(const long int &posicionEnBuffer,
			const bool &setDirtyBit);

	/*
	* Encadena entre si los nodos anterior y siguiente de la lista y corrige
	* las direcciones primera y ultima del recurso, si alguna corresponde con
	* la posicionEnSecundario del nodo que se elimino.
	*/
	void actualizarUnidadEliminada (const long int &posicionEnSecundario,
					const long int &posicionAnterior,
					const long int &posicionSiguiente);

	void liberarUnidadMenosUsada();

	/**
	 * Busca el dato por clave en el almacenamiento, siguiendo el orden de bloques más recientemente usados.
	 */
	virtual long int busquedaSecuencialLRU(Dato &dato, const Clave &clave);
};

}

#endif /* ESTRATEGIARECURSOESCRITURADIFERIDA_H_ */
